const Utils = (function () {
    let instance
    return function () {
        class Suibian {
            constructor() {

            }
            // 写方法
            ajax(options){
                // 请求地址是必传的 因为我没有办法给你一个默认地址
                if(!options.url){
                    // 手动抛出一个错误
                    throw new Error('url 是必传项')
                }
                if(!options.success){
                    // 手动抛出一个错误
                    throw new Error('success 函数是必传项')
                }
                if(typeof(options.success) !== 'function'){
                    throw new Error('success 必须是一个函数')
                }
            
                // 定义一个默认参数
                const defaultOptions = {
                    type:'get',
                    data:'',
                    dataType:''
                }
            
                // 把 defaultOptions 进行一个处理  传了参数用传入的 没有传入就用默认的
                for(let key in options){
                    defaultOptions[key] = options[key]
                }
            
                // console.log(defaultOptions)
                // 发送请求
                const xhr = new XMLHttpRequest()
                // 先把数据解构出来
                const { type,url,data,dataType,success } = defaultOptions
            
                if(type.toUpperCase() === 'GET'){
                    xhr.open(type,url + '?' + data)
                    xhr.send()
                }else{
                    xhr.open(type,url)
                    xhr.setRequestHeader('content-type','application/x-www-form-urlencoded')
                    xhr.send(data)
                }
            
                xhr.onreadystatechange = () => {
                    if(xhr.readyState === 4 && /^2\d{2}$/.test(xhr.status)){
                        // 请求成功可以拿到数据了 
                        dataType === 'json' ? success(JSON.parse(xhr.responseText)) : success(xhr.responseText)
                    }
                }
            
            }
            
            pAjax(options){
                return new Promise((resolve, reject) => {
                    ajax({
                        ...options,  // 把 options 展开放到这个对象里面
                        success(res) {
                            resolve(res)
                        }
                    })
                })
            }
        }
        if (!instance) {
            // 进入这个 if 条件代表 instance 没有值 那我就给他重新 赋值
            instance = new Suibian()
        }

        return instance
    }
})()

